#ifndef BUFFER_H_
#define BUFFER_H_

#include <iostream>
#include "Almacenamiento.h"
#include "ComponenteBuffer.h"
#include <list>
#include "../Constantes.h"

class Buffer: public Almacenamiento {

private:

	cantBytes maxCantidadBytes;
	cantBytes cantBytesActuales;

	list<ComponenteBuffer*> componentes;

public:

	/*
	 * Pre: -
	 * Pos: Crea una nueva instancia de Buffer con el tamanio maximo indicado en el argumento.
	 */
	Buffer(cantBytes maxCantidadBytes);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~Buffer();

	/*
	 * Pre: el tamanio de Bytes sea menor o igual al tamanio maximo soportado por el buffer.
	 * Pos: almacena los bytes en el offset indicado.
	 */
	virtual void escribir(const Bytes&, offset);

	/*
	 * Pre:-
	 * Pos: devuelve los bytes leidos, en caso de no tenerlos almacenados devuelve un Byte nulo.
	 */
	virtual Bytes leer(offset, cantBytes);

	/*
	 * Pre: -
	 * Pos: Imprime el contenido del buffer.
	 */
	void imprimirContenido();

	/*
	 * Pre: -
	 * Pos: Elimina los componentes con mayor offset al pasado por parametro
	 */

	 void eliminarOffsetSuperiores(offset offsetSuperior);

	 /*
	  * Pre: -
	  * Pos: Devuelve el tamanio libre disponible.
	  */

	  cantBytes getDisponible();

	/*
	 * Pre: -
	 * Pos: Libera al menos la cantidad indicada de bytes en el buffer.
	 * Nota: La politica de reemplazo utilizada es FIFO.
	 */
	void liberarEspacio(cantBytes cantidadBytes);

private:

	/*
	 * Pre: offsets coherentes.
	 * Pos: devuelve true si existe interseccion.
	 * Nota: La funcionalidad de este metodo es proveernos informacion acerca de todos los componentes que se intersecan con una nueva escritura
	 * en cada nueva ocacion.
	 */
	bool calcularInserseccion(offset offsetInicialA , offset offsetFinalA, offset offsetInicialB, offset offsetFinalB) const;

};

#endif /* BUFFER_H_ */
